package com.quanyan.common.utils;

import org.apache.commons.lang3.StringUtils;

/**
 * Created by zijun.song on 2015/8/6.
 */
public class EmojiFilter {


        /**
         * 检测是否有emoji字符
         * @param source
         * @return 一旦含有就抛出
         */
        public static boolean containsEmoji(String source) {
            if (StringUtils.isBlank(source)) {
                return false;
            }

            int len = source.length();

            for (int i = 0; i < len; i++) {
                char codePoint = source.charAt(i);

                if (isEmojiCharacter(codePoint)) {
                    //do nothing，判断到了这里表明，确认有表情字符
                    return true;
                }
            }

            return false;
        }

        private static boolean isEmojiCharacter(char codePoint) {
            return (codePoint == 0x0) ||
                    (codePoint == 0x9) ||
                    (codePoint == 0xA) ||
                    (codePoint == 0xD) ||
                    ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
                    ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
                    ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)) ||
                    ((codePoint >= 0x1F601) && (codePoint <= 0x1F64F)) ||
                    ((codePoint >= 0x1F601) && (codePoint <= 0x1F64F)) ||
                    ((codePoint >= 0x2702) && (codePoint <= 0x27B0)) ||
                    ((codePoint >= 0x1F680) && (codePoint <= 0x16C0)) ||
                    ((codePoint >= 0x24C2) && (codePoint <= 0x1F251)) ||
                    ((codePoint >= 0x2194) && (codePoint <= 0x1F5FF)) ||
                    ((codePoint >= 0x1F600) && (codePoint <= 0x1F636)) ||
                    ((codePoint >= 0x1F681) && (codePoint <= 0x1F6C5)) ||
                    ((codePoint >= 0x1F30D) && (codePoint <= 0x1F567)) ||
                    (codePoint == 0x00A9) || (codePoint == 0x00AE) ||
                    (codePoint == 0x203C) || (codePoint == 0x2049) ||
                    (codePoint == 0x2122) || (codePoint == 0x2139) ||
                    ((codePoint >= 0x0030) && (codePoint <= 0x0039)) ||
                    (codePoint == 0x0023);
        }

        /**
         * 过滤emoji 或者 其他非文字类型的字符
         * @param source
         * @return
         */
        public static String filterEmoji(String source) {

            if (!containsEmoji(source)) {
                return source;//如果不包含，直接返回
            }
            //到这里铁定包含
            StringBuilder buf = null;

            int len = source.length();

            for (int i = 0; i < len; i++) {
                char codePoint = source.charAt(i);

                if (isEmojiCharacter(codePoint)) {
                    if (buf == null) {
                        buf = new StringBuilder(source.length());
                    }

                    buf.append(codePoint);
                } else {
                }
            }

            if (buf == null) {
                return source;//如果没有找到 emoji表情，则返回源字符串
            } else {
                if (buf.length() == len) {//这里的意义在于尽可能少的toString，因为会重新生成字符串
                    buf = null;
                    return source;
                } else {
                    return buf.toString();
                }
            }

        }


    public static void main(String[] args){
        String str = "{\"subscribe\":1,\"openid\":\"oL_y9s9DzWQTrlLtzWw_0hxSI2OQ\",\"nickname\":\"\uF1EC\uF1E7\uF1EC\uF1E7\uF1EC\uF1E7\uF1EC\uF1E7\",\"sex\":1,\"language\":\"zh_CN\",\"city\":\"朝阳\",\"province\":\"北京\",\"cou中国\",\"headimgurl\":\"http:\\/\\/wx.qlogo.cn\\/mmopen\\/Q3auHgzwzM6ATTXCiaBNheE5DXibgJIkLsjBLheWh4YEjBKpXpPHXoaC6ZI9rKlVg0jxEK1VrIoQG8oB7G13icn1Q\\/0\",\"subscribe_time\":1439309061,\"remark\":\"\",\"groupid\":0}";

    }

}
